{+++++++++++++++++++++++++ НАЧАЛО СКАНЕРА +++++++++++++++++++++++++++++}
Procedure Scan;
{***************************************}
Procedure setpr(nit:byte);
Begin
 pr[up].kll:=chr(kll);
 pr[up].nit:=nit;
 pr[up].str:=str;
 up:=up+1;
 if up>kepr then
	      begin
		writeln('Переполнение,слишком большая программа');
		halt(1);
	      end;
End;

(***************************************)
Procedure Chfend(cerr:string);
Begin
 if fend then
	    begin
	      writeln(cerr);
	      halt(1);
	    end;
End;
(*******************3********************)
Procedure Getchar;
Begin
 if not eof (fin)
     then
      read(fin,ch)
     else fend:=true;
End;
(***************************************)
BEGIN
 lit:=['0'..'9','a'..'z','A'..'Z'];
 dec:=['0'..'9'];
 kint:=0; kid:=0; kstr:=0;up:=1;str:=1;
 ras:=['+','-','*','/',';',')','(','=',',',':','<','>'];
 fend:=false;

 getchar;

 repeat

  fts:=false;
  (* Цифра ? *)
  if ch in dec
	   then  begin
		   dint:='';
		   kll:=ord('D');
		   { десятичные константы }
		  repeat
		   dint:=dint+ch;getchar;
		  until not(ch in dec) or fend;

		    val(dint,w,r2);
		    if (length(dint)>5) or (w>32767)
			       then er('Слишком большое число',1);

			 if kint=0 then
			     begin
			       i:=1;tab_int[i]:=dint;
			       kint:=1;
			     end
		    else
		     begin
		       i:=0;
		       repeat
			i:=i+1;
		       until (dint=tab_int[i]) or (i=kint+1);
			if i=kint+1 then
				    begin
				     kint:=kint+1;tab_int[i]:=dint;
				    end;
		     end;
		  fts:=true;setpr(i);
		 end;
  (* Индификатор/Ключевое слово ? *)
  if ch in ['a'..'z','A'..'Z']
	   then Begin {1}
		  id_ssl:='';
		 repeat
		  id_ssl:=id_ssl+UpCase(ch);
		  getchar;
		 until not(ch in lit) or fend;
		  (* Ключевое слово ? *)
		   i:=0;
		   repeat
		    i:=i+1;
		   until (id_ssl=keyw[i]) or (i=kkw+1);

		     if i<>kkw+1 then
			(* Да ключевое слово *)
			kll:=ord('S')
			  else
			    begin {2}
			      kll:=ord('I');
			      (* Индификатор *)
				if kid=0 then begin  {3}
					     i:=1;tab_id[1]:=id_ssl;
					     kid:=1;
					      end     {3}
				else
				 begin	    {3}
				   i:=0;
				   repeat
				    i:=i+1;
				   until (id_ssl=tab_id[i]) or (i=kid+1);
				    if i=kid+1 then
						begin	     {4}
						 kid:=kid+1;
						 tab_id[i]:=id_ssl;
						end;	      {4}
				  end;	      {3}
			    end;   {2}
		  fts:=true;
		  setpr(i);
		End;{1}
   (***** Разделитель ? + * - / ; , ()	****)
   if ch in ras
	    then
	    begin
	     kll:=ord('R');
	     i:=0;
	     repeat
	      i:=i+1;
	     until ch=tab_ras[i];
	     getchar;
	     fts:=true;
	     setpr(i);
	    end;
    (* строковая константа *)
    if ch='"' then
		  begin
		   strc:='';kll:=ord('L');
		   getchar;
		  repeat
		   strc:=strc+ch;
		   getchar;
		  until (ch='"') or fend;

		   chfend('Неожиданный конец файла');

		   strc:=strc+'$';

			 if kstr=0 then
			   begin
			     i:=1;kstr:=1;
			     tab_str[1]:=strc;
			   end
		    else
			 begin
			    i:=0;
			   repeat
			     i:=i+1;
			   until (strc=tab_str[i]) or (i=kstr+1);
			      if i=kstr+1 then
				      begin
					kstr:=kstr+1;
					tab_str[i]:=strc;
				      end;
			 end;
		  fts:=true;getchar;
		  setpr(i);
		  end;

   if ch=#32
	    then
	       begin
		 getchar;
		 fts:=true;
	       end;



   if ch=#13 then
	     begin
	       getchar;
	       if ch=#10 then
		 begin
		  str:=str+1;
		  getchar;
		 end;
	       fts:=true;
	     end;



  if not fts then
		begin
		 write('Символ ',ch,' с кодом ',ord(ch));
		 writeln(' не пренадлежит алфавиту');
		 sound(400);delay(500);
		 nosound;halt(1);
		end;
 until fend;
 gstr:=str;
END;
{*********************** КОНЕЦ СКАНЕРА **************************}
